Neue Schaltflächen
Mithilfe eines Docking-Containers und einer Toolbar “zaubern” wir eine neue Schaltflächenleiste. Der Clou hierbei ist, dass der aktuelle GUI-Status ausgelesen wird und nur bestimmte Funktionen als Drucktaste aufgenommen werden.
Die Aufteilung der Funktionstasten kann bei großen Transaktionen sinnvoll sein. Hier könnten Funktionen, die für die gesamte Transaktion gelten in der Standard-Drucktastenleiste stehen und Funktionen, die für das aktuelle Dynpro notwendig sind, stehen in der Sidebar. Oder umgekehrt…
Unser Beispielprogramm zeigt ein Dynpro mit der “Sidebar”. Die Funktione, die in der Sidebar angezeigt werden, werden aus dem aktuellen GUI-Status gelesen. Dabei werden nur Funktionen angezeigt, die mit einem Dollarzeichen beginnen. So können wir im GUI-Status einfach definieren, welche Funktionen in die Sidebar aufgenommen werden.
Darstellung
Und so sieht unsere kleine Spielerei aus:
Abwandlung
Anstelle des Docking-Containers könnte man auch einen Dialogbox-Container nehmen (CL_GUI_DIALOGBOX_CONTAINER). Dann wären die Drucktasten in einem eigenen kleinen Fenster vorhanden, das der Anwender verschieben kann.
Info
Die Funktionen müssen natürlich nicht aus dem GUI-Status gelesen werden, sie können auch “per Hand” übertragen werden. Man muss dann im Programm steuern, welche Funktionen sichtbar sein sollen.
Ohne Applikationsbar…
Wenn man mal in der Höhe so viel Platz wie möglich haben möchte, dann kann man die Sidebar auch als Ersatz für die Drucktastenleiste nehmen. Dafür müssen natürlich auch die Systemfunktionen angezeigt werden und es muss evtl. auf “Trenner” im Status reagiert werden.
Wenn man dann in den Dynpro-Eigenschaften den Haken bei “Ohne Applikationsbar” setzt, dann steht der Platz, der für die Drucktastenleiste reserviert ist, dem Dynpro zu Verfügung…
Coding
REPORT ZZ_SIDEBAR. CLASS lcl_my_event_handler DEFINITION DEFERRED. DATA evt_receiver TYPE REF TO lcl_my_event_handler. DATA gr_box TYPE REF TO cl_gui_dialogbox_container. DATA gr_dock TYPE REF TO cl_gui_docking_container. DATA gr_toolbar TYPE REF TO cl_gui_toolbar. DATA gv_pfkey TYPE sypfkey VALUE 'BOX'. DATA gv_mode TYPE i. DATA gv_text TYPE text80. DATA gt_fkeys TYPE STANDARD TABLE OF rsmpe_keys. DATA gs_fkey TYPE rsmpe_keys. TYPE-POOLS icon. *----------------------------------------------------------------------* * CLASS lcl_my_event_handler DEFINITION *----------------------------------------------------------------------* CLASS lcl_my_event_handler DEFINITION. PUBLIC SECTION. METHODS: on_function_selected FOR EVENT function_selected OF cl_gui_toolbar IMPORTING fcode. ENDCLASS. "lcl_my_event_handler DEFINITION *----------------------------------------------------------------------* * CLASS lcl_my_event_handler IMPLEMENTATION *----------------------------------------------------------------------* CLASS lcl_my_event_handler IMPLEMENTATION. METHOD on_function_selected. CASE fcode. *** Docking-Container lösen WHEN 'KILLME'. FREE gr_toolbar. FREE gr_box. CALL METHOD gr_dock->free. CALL METHOD cl_gui_cfw=>flush. WHEN OTHERS. *** Funktionscode ausführen CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE' EXPORTING functioncode = fcode. ENDCASE. ENDMETHOD. "lcl_my_event_handler ENDCLASS. "lcl_my_event_handler IMPLEMENTATION START-OF-SELECTION. CALL SCREEN 100. *&---------------------------------------------------------------------* *& Form init *&---------------------------------------------------------------------* FORM init. DATA myevent_tab TYPE cntl_simple_events. DATA myevent TYPE cntl_simple_event. CHECK gr_dock IS INITIAL. *** Docking Container erzeugen CREATE OBJECT gr_dock EXPORTING repid = sy-cprog dynnr = sy-dynnr side = cl_gui_docking_container=>dock_at_left extension = 180 EXCEPTIONS OTHERS = 6. IF sy-subrc = 0. *** Toolbar erzeugen CREATE OBJECT gr_toolbar EXPORTING parent = gr_dock display_mode = cl_gui_toolbar=>m_mode_vertical. ENDIF. *** Ereignisbehandlungroutinen myevent-eventid = cl_gui_toolbar=>m_id_function_selected. myevent-appl_event = 'X'. APPEND myevent TO myevent_tab. CREATE OBJECT evt_receiver. CALL METHOD gr_toolbar->set_registered_events EXPORTING events = myevent_tab. SET HANDLER evt_receiver->on_function_selected FOR gr_toolbar. ENDFORM. "init *&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT *&---------------------------------------------------------------------* MODULE status_0100 OUTPUT. SET PF-STATUS gv_pfkey. SET TITLEBAR 'BOX'. PERFORM init. PERFORM transfer_box. ENDMODULE. " STATUS_0100 OUTPUT *&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* MODULE user_command_0100 INPUT. CASE sy-ucomm. WHEN 'BACK' OR 'HOME' OR 'END'. *** Exit SET SCREEN 0. LEAVE SCREEN. WHEN OTHERS. CASE sy-ucomm. WHEN 'CHANGE'. *** Wechseln-Knopf wurde gedrückt IF gv_pfkey = 'BOX1'. *** Status 2 einschalten gv_pfkey = 'BOX2'. ELSE. *** Status 1 einschalten gv_pfkey = 'BOX1'. ENDIF. WHEN OTHERS. *** "Normale" Funktionen IF sy-ucomm(1) = '$'. *** Bei den Funktionen aus der Sidebar gesondert reagieren: READ TABLE gt_fkeys INTO gs_fkey WITH KEY code = sy-ucomm. IF sy-subrc = 0. gv_text = gs_fkey-quickinfo. ENDIF. ENDIF. ENDCASE. ENDCASE. ENDMODULE. " USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* *& Form transfer_box *&---------------------------------------------------------------------* FORM transfer_box. STATICS lv_pfkey TYPE sypfkey. CHECK gr_toolbar IS BOUND. CHECK sy-pfkey <> lv_pfkey. lv_pfkey = sy-pfkey. DATA lv_func TYPE ui_func. DATA lv_info TYPE iconquick. DATA lv_text TYPE text40. *** GUI-Status lesen CALL FUNCTION 'RS_CUA_GET_STATUS' EXPORTING language = sy-langu program = sy-cprog status = sy-pfkey TABLES functionkeys = gt_fkeys EXCEPTIONS OTHERS = 6. *** Alle vorhandenen Knöpfe löschen CALL METHOD gr_toolbar->delete_all_buttons EXCEPTIONS OTHERS = 1. *** Schliessen-Knopf einfügen CALL METHOD gr_toolbar->add_button EXPORTING fcode = 'KILLME' icon = icon_close butn_type = '0' text = 'Fenster schließen' quickinfo = space is_checked = ' ' is_disabled = ' ' EXCEPTIONS cntb_error_fcode = 1. *** Den Wechseln-Knopf an zweiter Stelle positionieren READ TABLE gt_fkeys INTO gs_fkey WITH KEY code = 'CHANGE'. IF sy-subrc = 0. lv_func = gs_fkey-code. lv_info = gs_fkey-quickinfo. CALL METHOD gr_toolbar->add_button EXPORTING fcode = lv_func icon = gs_fkey-icon_id butn_type = '0' text = gs_fkey-text quickinfo = lv_info EXCEPTIONS cntb_error_fcode = 1. ENDIF. *** Dann einen "Trenner" CALL METHOD gr_toolbar->add_button EXPORTING fcode = '$$$' icon = space butn_type = '3' EXCEPTIONS cntb_error_fcode = 1. *** Und nun die aktiven Funktionen, die mit "$" beginnen LOOP AT gt_fkeys INTO gs_fkey WHERE active = 'X' AND code(1) = '$' AND sys_icon = space. lv_func = gs_fkey-code. lv_info = gs_fkey-quickinfo. CALL METHOD gr_toolbar->add_button EXPORTING fcode = lv_func icon = gs_fkey-icon_id butn_type = '0' text = gs_fkey-text quickinfo = lv_info EXCEPTIONS cntb_error_fcode = 1. ENDLOOP. CALL METHOD cl_gui_cfw=>dispatch. ENDFORM. "transfer_box
- 7. December: Excel Racing Simulation – Root Vole Race - 7. Dezember 2024
- 5. December: ABAPConf - 5. Dezember 2024
- 4. December: Only a lazy developer is a good developer - 4. Dezember 2024